package com.example.mq.mqserver.datacenter;

import com.example.mq.common.MqException;
import com.example.mq.mqserver.core.Binding;
import com.example.mq.mqserver.core.Exchange;
import com.example.mq.mqserver.core.MSGQueue;
import com.example.mq.mqserver.core.Message;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

/**
 * 使用这个类来管理所有硬盘上的文件
 * 1.数据库:交换机 绑定 队列
 * 2.数据文件: 消息
 * 上层逻辑如果要操作硬盘 统一使用这个类来执行
 */
public class DiskDataCenter {

    //这个实例用来管理数据库中的数据
    private DataBaseManager dataBaseManager=new DataBaseManager();

    //这个实例用来管理数据文件中的数据
    private MessageFileManger  messageFileManger=new MessageFileManger();



    public void init(){
        //针对上述两个实例 进行初始化
        dataBaseManager.init();
        //当前messageFileManger.init 是空的方法 我们只是先列在这里 如果后面有拓展 就在这里初始化即可
        messageFileManger.init();

    }

    //封装交换机操作
    public void insertExchange(Exchange exchange){
        //新增交换机
        dataBaseManager.insertExchange(exchange);
    }

    //根据name 删除交换机
    public void deleteExchange(String exchangeName){
        dataBaseManager.deleteExchange(exchangeName);
    }

    //查询所有交换机
    public List<Exchange> selectAllExchange(){
        return dataBaseManager.selectAllExchanges();
    }

    //封装队列操作
    public void insertQueue(MSGQueue queue) throws IOException {
        //新增队列
        dataBaseManager.insertQueue(queue);
        //创建队列的同时 不仅是把队列对象写到数据库中 还需要在硬盘中创建出对应的目录和文件
        messageFileManger.createQueueFiles(queue.getName());
    }

    //删除队列
    public void deleteQueue(String queueName) throws IOException {
        dataBaseManager.deleteQueue(queueName);
        //删除队列的同时 不仅是把队列对象在数据库中删除 还需要删除硬盘对应的目录和文件
        messageFileManger.destroyQueueFiles(queueName);
    }

    //查询所有队列
    public List<MSGQueue> selectAllQueue(){
        return dataBaseManager.selectAllQueues();
    }

    //封装绑定操作
    //插入绑定
    public void insertBinding(Binding binding){
        dataBaseManager.insertBinding(binding);
    }

    //删除绑定
    public void deleteBinding(Binding binding){
        dataBaseManager.deleteBinding(binding);
    }

    //查询所有绑定
    public List<Binding> selectAllBinding(){
        return dataBaseManager.selectAllBindings();
    }


    //封装消息操作
    //发送消息
    public void sendMessage(MSGQueue queue, Message message) throws IOException, MqException {
        messageFileManger.sendMessage(queue,message);
    }

    //删除消息
    public void deleteMessage(MSGQueue queue,Message message) throws IOException, ClassNotFoundException, MqException {
        messageFileManger.deleteMessage(queue,message);
        //考虑是不是需要gc 当前就是多了一个无效数据
        //判断是否需要gc
        if (messageFileManger.checkGC(queue.getName())){
            messageFileManger.gc(queue);
        }
    }


    //查询队列的所有消息
    public LinkedList<Message> loadAllMessageFromQueue(String queueName) throws IOException, MqException, ClassNotFoundException {
        return messageFileManger.loadAllMessageFromQueue(queueName);
    }



}
